/**
 ******************************************************************************
 * @file    bsp_adc_potentiometer.c
 * @author  fire
 * @version V1.0
 * @date    2024-xx-xx
 * @brief   ADC应用函数接口
 ******************************************************************************
 * @attention
 *
 * 实验平台:野火 F103 STM32 开发板
 * 论坛    :http://www.firebbs.cn
 * 淘宝    :https://fire-stm32.taobao.com
 *
 ******************************************************************************
 */
#include "adc/bsp_adc_potentiometer.h"
#include "usart/bsp_debug_usart.h"

ADC_HandleTypeDef ADC_InitStruct;
GPIO_InitTypeDef GPIO_InitStruct;
ADC_ChannelConfTypeDef ADC_Channel_InitStruct;

uint8_t potentiometer_flag = 0;           //电位器标志位
uint16_t potentiometer_task_time;         //电位器任务计时计数值

/**
 * @brief  电位器GPIO配置
 * @param  无
 * @retval 无
 */
static void Potentiometer_GPIO_Config(void)
{
    /* 开启ADC相关的GPIO外设时钟 */
    ADCX_IN_GPIO_CLK_ENABLE();
    /* 选择要控制的GPIO引脚 */
    GPIO_InitStruct.Pin = ADCX_IN_GPIO_PIN;
    /* 设置引脚的输出类型为模拟输入 */
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    /* 设置引脚为浮空模式 */
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    /* 设置引脚速率为高速 */
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    /* 调用库函数，使用上面配置的GPIO_InitStructure初始化GPIO */
    HAL_GPIO_Init(ADCX_IN_GPIO_PORT, &GPIO_InitStruct);
}

/**
 * @brief  电位器ADC配置
 * @param  无
 * @retval 无
 */
static void Potentiometer_ADC_Config(void)
{
    /* 开启ADC外设时钟 */
    ADCX_CLK_ENABLE();

    ADC_InitStruct.Instance = ADCX;
    /* 连续转换 */
    ADC_InitStruct.Init.ContinuousConvMode = ENABLE;
    /* 数据对齐方式：数据右对齐(12位ADC) */
    ADC_InitStruct.Init.DataAlign = ADC_DATAALIGN_RIGHT;
    /* 失能间断模式 */
    ADC_InitStruct.Init.DiscontinuousConvMode = DISABLE;
    /* 软件触发 */
    ADC_InitStruct.Init.ExternalTrigConv = ADC_SOFTWARE_START;
    /* 设置转换通道数 */
    ADC_InitStruct.Init.NbrOfConversion = 1;
    /* 失能扫描模式 */
    ADC_InitStruct.Init.ScanConvMode = DISABLE;
    
    HAL_ADC_Init(&ADC_InitStruct);

    /* 设置转化通道 */
    ADC_Channel_InitStruct.Channel = ADCX_CHANNEL;
    /* 设置转换顺序 */
    ADC_Channel_InitStruct.Rank = ADC_REGULAR_RANK_1;
    /* 设置采样时间 */
    ADC_Channel_InitStruct.SamplingTime = ADC_CONVERSIONCLOCKCYCLES_SAMPLETIME_71CYCLES5;
    HAL_ADC_ConfigChannel(&ADC_InitStruct, &ADC_Channel_InitStruct);
		
		
    /* 校准ADC */
    HAL_ADCEx_Calibration_Start(&ADC_InitStruct);
    
    /* 使能ADCX */
    HAL_ADC_Start(&ADC_InitStruct);
}

/**
 * @brief  电位器初始化
 * @param  无
 * @retval 无
 */
void Potentiometer_ADC_Init(void)
{
    Potentiometer_GPIO_Config();
    Potentiometer_ADC_Config();

}

/**
 * @brief  电位器ADC采集任务
 * @param  无
 * @retval 无
 */
void Potentiometer_ADC_Task(void)
{
    /* 检查电位器标志位 */  
    if(potentiometer_flag)      
    {
        /* 等待ADCX转化完成　等待时间ms级 */
        HAL_ADC_PollForConversion(&ADC_InitStruct, 10);

        /* 判断转换完成标志位是否置1 即转换是否完成 */
        if (HAL_IS_BIT_SET(HAL_ADC_GetState(&ADC_InitStruct), HAL_ADC_STATE_EOC_REG))
        {
            printf("\r\nThe current voltage = %0.2f V\r\n", (float)HAL_ADC_GetValue(&ADC_InitStruct) / 4096 * 3.3);
            printf("\r\nThe current AD value = %d\r\n", HAL_ADC_GetValue(&ADC_InitStruct));
        }  
        /* 清除电位器标志位 */    
        potentiometer_flag = 0;
    }
}
